package net.cjw.initsb.config.quartz.register;

import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import net.cjw.initsb.config.quartz.task.ScheduleTask;
import net.cjw.initsb.config.quartz.task.ScheduleTask2;

@Configuration
public class RegisterScheduleTask {

	// sayHello 任务配置
	/**
	 * 配置定时任务
	 */
	@Primary
	@Bean(name = "jobDetailSayHello")
	public MethodInvokingJobDetailFactoryBean detailFactoryBeanBySayHello(ScheduleTask task) {// ScheduleTask为需要执行的任务
		MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
		/*
		 * 是否并发执行 例如每5s执行一次任务，但是当前任务还没有执行完，就已经过了5s了，
		 * 如果此处为true，则下一个任务会执行，如果此处为false，则下一个任务会等待上一个任务执行完后，再开始执行
		 */
		jobDetail.setConcurrent(false);

		jobDetail.setName("我是SayHello任务名称");// 设置任务的名字
		jobDetail.setGroup("我是SayHello任务分组");// 设置任务的分组，这些属性都可以存储在数据库中，在多任务的时候使用

		/*
		 * 为需要执行的实体类对应的对象
		 */
		jobDetail.setTargetObject(task);

		/*
		 * sayHello为需要执行的方法
		 * 通过这几个配置，告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法
		 */
		jobDetail.setTargetMethod("sayHello");
		return jobDetail;
	}

	/**
	 * 配置定时任务的触发器，也就是什么时候触发执行定时任务
	 */
	@Primary
	@Bean(name = "jobTriggerSayHello")
	public CronTriggerFactoryBean cronJobTriggerBySayHello(
			@Qualifier("jobDetailSayHello") MethodInvokingJobDetailFactoryBean jobDetail) {
		CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
		tigger.setJobDetail(jobDetail.getObject());
		tigger.setCronExpression("0/15 * * * * ?");// 初始时的cron表达式
		tigger.setName("我是SayHello定时任务触发器名称");// trigger的name
		return tigger;

	}

	// sayHi 任务配置
	/**
	 * 配置定时任务
	 */
	@Bean(name = "jobDetailSayHi")
	public MethodInvokingJobDetailFactoryBean detailFactoryBeanBySayHi(ScheduleTask2 task) {// ScheduleTask为需要执行的任务
		MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
		/*
		 * 是否并发执行 例如每5s执行一次任务，但是当前任务还没有执行完，就已经过了5s了，
		 * 如果此处为true，则下一个任务会执行，如果此处为false，则下一个任务会等待上一个任务执行完后，再开始执行
		 */
		jobDetail.setConcurrent(false);

		jobDetail.setName("我是SayHi任务名称");// 设置任务的名字
		jobDetail.setGroup("我是SayHi任务分组");// 设置任务的分组，这些属性都可以存储在数据库中，在多任务的时候使用

		/*
		 * 为需要执行的实体类对应的对象
		 */
		jobDetail.setTargetObject(task);

		/*
		 * sayHello为需要执行的方法
		 * 通过这几个配置，告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法
		 */
		jobDetail.setTargetMethod("sayHi");
		return jobDetail;
	}

	/**
	 * 配置定时任务的触发器，也就是什么时候触发执行定时任务
	 */
	@Bean(name = "jobTriggerSayHi")
	public CronTriggerFactoryBean cronJobTriggerBySayHi(
			@Qualifier("jobDetailSayHi") MethodInvokingJobDetailFactoryBean jobDetail) {
		CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
		tigger.setJobDetail(jobDetail.getObject());
		tigger.setCronExpression("0/15 * * * * ?");// 初始时的cron表达式
		tigger.setName("我是SayHi定时任务触发器名称");// trigger的name
		tigger.setDescription("我是SayHi描述");
		tigger.setGroup("我是SayHi触发器分组");
		return tigger;

	}

	/**
	 * 定义quartz调度工厂
	 */
	@Primary
	@Bean(name = "scheduler")
	public SchedulerFactoryBean schedulerFactoryBySayHello(@Qualifier("jobTriggerSayHello") Trigger cronJobTrigger1,
			@Qualifier("jobTriggerSayHi") Trigger cronJobTrigger2) {
		SchedulerFactoryBean bean = new SchedulerFactoryBean();
		// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
		bean.setOverwriteExistingJobs(true);
		// 延时启动，10秒后启动 配置了每5秒查询数据库配置,确保读取数据库配置才工作
		bean.setStartupDelay(10);
		// 注册触发器
		bean.setTriggers(cronJobTrigger1, cronJobTrigger2);
		return bean;
	}

}
